package com.alphay.boot.common.core.domain.entity;

import java.util.Date;
import java.util.List;
import javax.validation.constraints.*;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.alphay.boot.common.annotation.Excel;
import com.alphay.boot.common.annotation.Excel.ColumnType;
import com.alphay.boot.common.annotation.Excel.Type;
import com.alphay.boot.common.annotation.Excels;
import com.alphay.boot.common.core.domain.BaseEntity;
import com.alphay.boot.common.xss.Xss;

/**
 * 用户对象 sys_user
 *
 * @author d3code
 */
public class SysUser extends BaseEntity {
  private static final long serialVersionUID = 1L;

  /** 用户ID */
  @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
  @TableId(type = IdType.AUTO)
  private Long userId;

  /** 部门ID */
  @Excel(name = "部门编号", type = Type.IMPORT)
  private Long deptId;

  /** 用户账号 */
  @Excel(name = "登录名称")
  private String userName;

  /** 用户昵称 */
  @Excel(name = "用户名称")
  private String nickName;

  /** 用户邮箱 */
  @Excel(name = "用户邮箱")
  private String email;

  /** 手机号码 */
  @Excel(name = "手机号码")
  private String phonenumber;

  /** 用户性别 */
  @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
  private String sex;

  /** 用户头像 */
  private String avatar;

  /** 密码 */
  private String password;

  /** 帐号状态（0正常 1停用） */
  @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
  private String status;

  /** 最后登录IP */
  @Excel(name = "最后登录IP", type = Type.EXPORT)
  private String loginIp;

  /** 最后登录时间 */
  @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
  private Date loginDate;

  /** 部门对象 */
  @Excels({
    @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
    @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
  })
  @TableField(exist = false)
  private SysDept dept;

  /** 角色对象 */
  @TableField(exist = false)
  private List<SysRole> roles;

  /** 角色组 */
  @TableField(exist = false)
  private Long[] roleIds;

  /** 岗位组 */
  @TableField(exist = false)
  private Long[] postIds;

  /** 角色ID */
  @TableField(exist = false)
  private Long roleId;

  public SysUser() {}

  public SysUser(Long userId) {
    this.userId = userId;
  }

  public Long getUserId() {
    return userId;
  }

  public void setUserId(Long userId) {
    this.userId = userId;
  }

  public boolean isAdmin() {
    return isAdmin(this.userId);
  }

  public static boolean isAdmin(Long userId) {
    return userId != null && 1L == userId;
  }

  public Long getDeptId() {
    return deptId;
  }

  public void setDeptId(Long deptId) {
    this.deptId = deptId;
  }

  @Xss(message = "用户昵称不能包含脚本字符")
  @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
  public String getNickName() {
    return nickName;
  }

  public void setNickName(String nickName) {
    this.nickName = nickName;
  }

  @Xss(message = "用户账号不能包含脚本字符")
  @NotBlank(message = "用户账号不能为空")
  @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  @Email(message = "邮箱格式不正确")
  @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
  public String getPhonenumber() {
    return phonenumber;
  }

  public void setPhonenumber(String phonenumber) {
    this.phonenumber = phonenumber;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }

  public String getAvatar() {
    return avatar;
  }

  public void setAvatar(String avatar) {
    this.avatar = avatar;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public String getStatus() {
    return status;
  }

  public void setStatus(String status) {
    this.status = status;
  }

  public String getLoginIp() {
    return loginIp;
  }

  public void setLoginIp(String loginIp) {
    this.loginIp = loginIp;
  }

  public Date getLoginDate() {
    return loginDate;
  }

  public void setLoginDate(Date loginDate) {
    this.loginDate = loginDate;
  }

  public SysDept getDept() {
    return dept;
  }

  public void setDept(SysDept dept) {
    this.dept = dept;
  }

  public List<SysRole> getRoles() {
    return roles;
  }

  public void setRoles(List<SysRole> roles) {
    this.roles = roles;
  }

  public Long[] getRoleIds() {
    return roleIds;
  }

  public void setRoleIds(Long[] roleIds) {
    this.roleIds = roleIds;
  }

  public Long[] getPostIds() {
    return postIds;
  }

  public void setPostIds(Long[] postIds) {
    this.postIds = postIds;
  }

  @Override
  public String toString() {
    return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
        .append("userId", getUserId())
        .append("deptId", getDeptId())
        .append("userName", getUserName())
        .append("nickName", getNickName())
        .append("email", getEmail())
        .append("phonenumber", getPhonenumber())
        .append("sex", getSex())
        .append("avatar", getAvatar())
        .append("password", getPassword())
        .append("status", getStatus())
        .append("loginIp", getLoginIp())
        .append("loginDate", getLoginDate())
        .append("createBy", getCreateBy())
        .append("createTime", getCreateTime())
        .append("updateBy", getUpdateBy())
        .append("updateTime", getUpdateTime())
        .append("remark", getRemark())
        .append("dept", getDept())
        .toString();
  }
}
